package cn.wolfcode.luowowo.service.impl;

import cn.wolfcode.luowowo.cache.service.IUserInfoRedisService;
import cn.wolfcode.luowowo.domain.UserInfo;
import cn.wolfcode.luowowo.exception.LogicException;
import cn.wolfcode.luowowo.repository.UserInfoRepository;
import cn.wolfcode.luowowo.service.IUserInfoService;
import cn.wolfcode.luowowo.util.AssertUtil;
import cn.wolfcode.luowowo.util.Consts;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;


@Service
public class UserInfoServiceImpl implements IUserInfoService {



    @Autowired
    private UserInfoRepository userInfoRepository;

    @Autowired
    private IUserInfoRedisService userInfoRedisService;

    @Override
    public UserInfo get(String id) {
        return userInfoRepository.findById(id).get();
    }

    @Override
    public UserInfo checkPhone(String phone) {

        return userInfoRepository.findByPhone(phone);
    }

    @Override
    public void sendVerifyCode(String phone,String smsUrl,String smsAppKey) {
        // 1. 生成验证码
        String code = (int) (Math.random() * 9000 + 1000) + "";

        // 2. 发送短信到手机
        StringBuilder smsInfo = new StringBuilder(100);
        smsInfo.append("【骡窝窝】您的验证码是:")
                .append(code).append("请在")
                .append(Consts.VERIFY_CODE_VAI_TIME)
                .append("分钟内输入");
        System.out.println(smsInfo);
        // 使用京东万象 短信平台,发送短信
//        RestTemplate template = new RestTemplate();
//        String str = template.getForObject(smsUrl, String.class, phone, smsInfo.toString(), smsAppKey);
//        System.err.println(str);
//        if (!str.contains("Success")) {
//            throw new LogicException("发送失败,请重试");
//        }



        // 3. 保存验证码 - 使用redis
        // 虽然session也是不错的选中,但是session有几个弊端,就是如果客户端不是PC的话,对session的支持不是很友好,
        // 再有就是数据共享的问题,在并发高的情况下,如果项目布局是分布式,那么session将面临数据共享的问题
        // 再有就是redis本身就有很好的过期机制支持
        userInfoRedisService.setUserSmsCode(phone, code);


    }


    @Override
    public void save(String phone, String nickname, String password, String rpassword, String verifyCode) {
        // 判断传入的参数是否为空,为空则返回相应的提示信息
        // Assert.hasLength(phone,"11");
        AssertUtil.hasLength(phone, "请输入正确的手机号");
        AssertUtil.hasLength(nickname, "请输入昵称");
        AssertUtil.hasLength(password, "请输入密码");
        AssertUtil.hasLength(rpassword, "请输入确认密码");
        AssertUtil.hasLength(verifyCode, "请输入验证码");

        // 判断手机号是否合法
        AssertUtil.isMobileNo(phone,"手机号不能为空","手机号不合法");

        // 判断两次输入的密码是否一致
        AssertUtil.isEquals(password, rpassword, "两次输入的密码不一致");

        // 判断验证码是否正确
        String code = userInfoRedisService.getUserSmsCode(phone);
        if(code == null){
            throw new LogicException("请先获取验证码");
        }
        if(!(code.equals(verifyCode))){
            throw new LogicException("请输入正确的验证码");
        }



        // 数据保存操作
        UserInfo user = new UserInfo();
        user.setNickname(nickname); // 昵称
        user.setPhone(phone);   // 手机号
        user.setPassword(password); // 密码
        user.setEmail("");  // 邮箱
        user.setCity("");   // 所在城市
        user.setInfo("");   // 个性签名
        user.setHeadImgUrl("/images/default.jpg");  // 默认头像
        user.setState(0);   // 账号状态  1:冻结 0:正常


        userInfoRepository.save(user);



    }

    @Override
    public UserInfo userLogin(String username, String password) {
        // 1.先通过手机号查看用户是否存在
        UserInfo user = this.checkPhone(username);
        // 2.不存在,提示异常信息
        if(user == null){
            throw new LogicException("账号不存在,请先注册");
        }
        // 3.存在,则查看密码是否一致
        if (!(password.equals(user.getPassword()))) {
            // 4. 如果密码不一致,提示异常信息
            throw new LogicException("密码错误,请重新输入");
        }
        // 因为user对象最终需要返回给前端,为了安全起见,将密码置空
        user.setPassword(null);
        return user;

    }

    @Override
    public List<UserInfo> list() {

        return userInfoRepository.findAll();
    }

    @Override
    public List<UserInfo> getByCity(String keyword) {

        return userInfoRepository.findByCity(keyword);
    }


}
